package com.nuoniu.sibanyun.service.production;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.nuoniu.sibanyun.entity.dto.ChangeWorkerDto;
import com.nuoniu.sibanyun.entity.dto.VProductionWorkDetailSearchDto;
import com.nuoniu.sibanyun.entity.dto.mobile.DispatchSearchDto;
import com.nuoniu.sibanyun.entity.dto.mobile.ProcedureDetailSearchDto;
import com.nuoniu.sibanyun.entity.production.VProductionWorkMain;
import com.nuoniu.sibanyun.entity.production.VProductionWorkProcedureDetail;
import com.nuoniu.sibanyun.entity.vo.*;
import com.nuoniu.sibanyun.entity.vo.reportVo.UnFinishProductionWorkMainVo;

import java.math.BigDecimal;
import java.util.List;

/**
 * <p>
 * 派工单——工序明细 服务类
 * </p>
 *
 * @author 白强
 * @since 2021-03-20
 */
public interface IVProductionWorkProcedureDetailService extends IService<VProductionWorkProcedureDetail> {

    /**
     * 通过 加工单ID 查询工序明细
     * @param productionWorkMainId
     * @return
     */
    List<VProductionWorkProcedureDetailVo> listByProductionWorkId(Long productionWorkMainId);
    /**
     * 获取派工单 工序明细（废弃）
     * @param dispatchId
     * @return
     */
    List<VProductionWorkProcedureDetailVo> listByProductionDispatchId(Long dispatchId);

    /**
     * 根据生产加工单 工序明细ID 获取加工工序详情
     * @param id
     * @return
     */
    VProductionWorkProcedureDetailVo getVProductionWorkProcedureDetailVo(Integer id);

    /**
     *  根据 加工单明细ID 和 工序顺序 获取加工工序详情
     * @param detailId  加工单_明细_ID
     * @param procedureId   工序ID
     * @return
     */
    VProductionWorkProcedureDetailVo getVProductionWorkProcedureDetailVoByProcedureId(Integer detailId,Integer procedureId);

    /**
     *  根据 加工单明细ID 和 工序顺序 获取加工工序详情
     * @param detailId  加工单_明细_ID
     * @param order   工序顺序
     * @return
     */
    VProductionWorkProcedureDetailVo getVProductionWorkProcedureDetailVoByOrder(Integer detailId,Integer order);

    /**
     *  根据 加工单明细ID 和 工序顺序 获取 某个工序后 累计不合格数量累计
     * @param detailId  加工单_明细_ID
     * @param order   工序顺序
     * @return
     */
    BigDecimal getTotalCumUnqualifiedQuantityBeginOrder(Integer detailId,Integer order);

    /**
     * 查询 上道工序 累计可流转数量（累计合格数量 + 返工数量）
     * @param productionDispatchId
     * @param order
     * @return
     */
    BigDecimal getLastProcedureCumQualifiedQuantityBeginOrder(Integer productionDispatchId,Integer order);

    /**
     * 批量更新 同一派工单下的相同工艺路线工序的派工任务
     * @param productionDispatchId
     * @param processRouteDetailId
     * @param status
     */
    void batchUpdateStatus(Integer productionDispatchId,Integer processRouteDetailId,Integer status);



    /**
     * 查询 上道工序 是否完工
     * @param productionDispatchId  派工单ID
     * @param order
     * @return
     */
    boolean isLastProcedureFinished(Integer productionDispatchId, Integer order);

    /**
     * 工序派工任务 变更工人
     * @param changeWorkerDto
     */
    void changeWorkId(ChangeWorkerDto changeWorkerDto);



    /**
     * 查询 未完成的派工单 和 派工明细 （分 数据权限 ）废弃
     * @param productionDispatchMainSearchDto
     * @return
     */
    VProductionWorkProcedureDetailDispatchVo getUnFinishProcedureDetailDispatchVo(VProductionWorkDetailSearchDto productionDispatchMainSearchDto);

    /**
     * 查询 未完成产品明细 和 工序明细（数据权限）
     * @param productionWorkDetailSearchDto
     * @return
     */
    UnFinishProductionWorkMainVo getUnFinishProductionWorkVo(VProductionWorkDetailSearchDto productionWorkDetailSearchDto);







    /*************************************   手机端  *****************************************/


    /**
     * 获取未完成的派工单（移动端）
     * @param dispatchSearchDto
     * @return
     */
    Page<VProductionDispatchSimpleVo> pagePersonalDispatch(Page page, DispatchSearchDto dispatchSearchDto);

    /**
     * 获取未完成的派工工序任务单（移动端）
     * @param page
     * @param procedureDetailSearchDto
     * @return
     */
    Page<VProcedureDetailSimpleVo> pageVProcedureDetailSimpleVo(Page page, ProcedureDetailSearchDto procedureDetailSearchDto);











    /**
     * 批量保存 工序明细
     * @param productionWorkMain
     * @param detailIds
     */
    void batchSave(VProductionWorkMain productionWorkMain, List<Long> detailIds);

    /**
     * 根据 加工单ID 删除 工序明细
     * @param mainId
     */
    void deleteFromMainId(Long mainId);





}
